#include "head.h"
#include "TCP.h"
#include "Sqlite.h"
#include "stm32.h"

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 广播消息给所有客户端
void broadcast_message(sqlite3 *db, const char *sender, const char *message) {
    int fds[100];
    int count = ClientData_GetAllFds(db, fds, 100);
    if (count <= 0) return;

    char buffer[512];
    sprintf(buffer, "[%s]: %s\n", sender, message);

    for (int i = 0; i < count; i++) {
        send(fds[i], buffer, strlen(buffer), 0);
    }
}

// 客户端处理线程
void *client_handler(void *arg) {
    int client_fd = *(int *)arg;
    free(arg);

    sqlite3 *db = Sqlite3_Init();
    if (!db) {
        close(client_fd);
        return NULL;
    }

    // 初始状态：未登录
    int is_logged = 0;
    char username[64] = {0};

    // 插入客户端记录（初始昵称未设置）
    ClientData client = {client_fd, ""};
    ClientData_Insert(db, client);

    char recv_buf[512];
    char send_buf[512];

    // 发送欢迎信息
    const char *welcome = "欢迎使用智能管家系统！\n"
                          "请先注册或登录：\n"
                          "注册:用户名:密码:家庭密钥\n"
                          "登录:用户名:密码";
    send(client_fd, welcome, strlen(welcome), 0);

    while (1) {
        memset(recv_buf, 0, sizeof(recv_buf));
        int recv_len = recv(client_fd, recv_buf, sizeof(recv_buf), 0);

        if (recv_len <= 0) {
            printf("客户端 %d 断开连接\n", client_fd);
            break;
        }

        // 去除换行符
        recv_buf[strcspn(recv_buf, "\n")] = 0;

        // 解析命令
        if (strstr(recv_buf, "注册:")) {
            // 注册:用户名:密码:家庭密钥
            char *cmd = strtok(recv_buf, ":");
            char *name = strtok(NULL, ":");
            char *pwd = strtok(NULL, ":");
            char *key = strtok(NULL, ":");

            if (!name || !pwd || !key) {
                send(client_fd, "注册格式错误！请使用：注册:用户名:密码:家庭密钥", 
                     strlen("注册格式错误！请使用：注册:用户名:密码:家庭密钥"), 0);
                continue;
            }

            int result = Account_Register(db, name, pwd, key);
            if (result == 0) {
                send(client_fd, "注册成功！请登录", 
                     strlen("注册成功！请登录"), 0);
            } else if (result == -1) {
                send(client_fd, "注册失败：家庭密钥错误", 
                     strlen("注册失败：家庭密钥错误"), 0);
            } else if (result == -2) {
                send(client_fd, "注册失败：用户名已存在", 
                     strlen("注册失败：用户名已存在"), 0);
            } else {
                send(client_fd, "注册失败：未知错误", 
                     strlen("注册失败：未知错误"), 0);
            }

        } else if (strstr(recv_buf, "登录:")) {
            // 登录:用户名:密码
            char *cmd = strtok(recv_buf, ":");
            char *name = strtok(NULL, ":");
            char *pwd = strtok(NULL, ":");

            if (!name || !pwd) {
                send(client_fd, "登录格式错误！请使用：登录:用户名:密码", 
                     strlen("登录格式错误！请使用：登录:用户名:密码"), 0);
                continue;
            }

            int result = Account_Login(db, name, pwd);
            if (result == 0) {
                is_logged = 1;
                strcpy(username, name);
                
                // 更新客户端表中的昵称
                char update_sql[256];
                sprintf(update_sql, "UPDATE clients SET name = '%s' WHERE sock_fd = %d;", 
                        name, client_fd);
                sqlite3_exec(db, update_sql, NULL, NULL, NULL);

                // 广播新用户加入
                broadcast_message(db, "系统", 
                                  (char *)malloc(strlen(name) + 20));
                sprintf(send_buf, "%s 加入了家庭群聊", name);
                broadcast_message(db, "系统", send_buf);

                send(client_fd, "登录成功！", 
                     strlen("登录成功！"), 0);
            } else if (result == -1) {
                send(client_fd, "登录失败：用户不存在", 
                     strlen("登录失败：用户不存在"), 0);
            } else if (result == -2) {
                send(client_fd, "登录失败：密码错误", 
                     strlen("登录失败：密码错误"), 0);
            } else {
                send(client_fd, "登录失败：未知错误", 
                     strlen("登录失败：未知错误"), 0);
            }

        } else if (!is_logged) {
            send(client_fd, "请先登录或注册！", 
                 strlen("请先登录或注册！"), 0);

        } else if (strstr(recv_buf, "设备控制:")) {
            // 设备控制:命令
            char *cmd = strtok(recv_buf + 5, ":");  // 跳过"设备控制:"
            
            DeviceCmd device_cmd;
            if (strcmp(cmd, "BUZZER_ON")) {
                device_cmd = CMD_BUZZER_ON;
            } else if (strcmp(cmd, "BUZZER_OFF")) {
                device_cmd = CMD_BUZZER_OFF;
            } else if (strcmp(cmd, "LED_ON")) {
                device_cmd = CMD_LED_ON;
            } else if (strcmp(cmd, "LED_OFF")) {
                device_cmd = CMD_LED_OFF;
            } else if (strcmp(cmd, "GET_TEMP")) {
                device_cmd = CMD_GET_TEMP;
            } else if (strcmp(cmd, "GET_HUMIDITY")) {
                device_cmd = CMD_GET_HUMIDITY;
            } else {
                send(client_fd, "未知设备命令！", 
                     strlen("未知设备命令！"), 0);
                continue;
            }

            // 执行设备控制
            char response[128];
            if (Device_Control(device_cmd, response, sizeof(response)) == 0) {
                send(client_fd, response, strlen(response), 0);
            } else {
                send(client_fd, "设备控制失败！", 
                     strlen("设备控制失败！"), 0);
            }

        } else if (strstr(recv_buf, "帮助")) {
            const char *help_msg = "可用命令：\n"
                                  "设备控制:BUZZER_ON - 打开蜂鸣器\n"
                                  "设备控制:BUZZER_OFF - 关闭蜂鸣器\n"
                                  "设备控制:LED_ON - 打开LED\n"
                                  "设备控制:LED_OFF - 关闭LED\n"
                                  "设备控制:GET_TEMP - 获取温度\n"
                                  "设备控制:GET_HUMIDITY - 获取湿度\n"
                                  "直接输入消息可进行群聊";
            send(client_fd, help_msg, strlen(help_msg), 0);

        } else {
            // 群聊消息
            broadcast_message(db, username, recv_buf);
        }
    }

    // 清理资源
    if (is_logged) {
        // 广播用户离开
        sprintf(send_buf, "%s 离开了家庭群聊", username);
        broadcast_message(db, "系统", send_buf);
    }

    ClientData_DeleteByFd(db, client_fd);
    sqlite3_close(db);
    close(client_fd);
    return NULL;
}

int main(int argc, char const *argv[]) {
    // 初始化设备（实际项目需对接硬件）
    Device_Init();

    // 初始化 TCP 服务器
    if (TCP_Sercer_Config(6060, NULL) < 0) {
        return -1;
    }

    // 初始化数据库
    sqlite3 *db = Sqlite3_Init();
    if (!db) {
        return -1;
    }
    sqlite3_close(db);  // 主线程关闭，各线程单独打开

    printf("智能管家系统已启动，等待客户端连接...\n");

    // 主循环
    while (1) {
        int client_fd = TCP_Accept();
        if (client_fd < 0) continue;

        // 为每个客户端创建线程
        int *p_client_fd = malloc(sizeof(int));
        *p_client_fd = client_fd;

        pthread_t tid;
        pthread_create(&tid, NULL, client_handler, p_client_fd);
        pthread_detach(tid);  // 分离线程，自动回收资源
    }

    return 0;
}